package org.dezenho.server.RN;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import org.dezenho.server.SO.DezenhoServer;

/**
 * Classe responsavel pelo controle dos jogadores na Sala de Espera
 * 
 * @author marcelasobrinhopereira
 * 
 */
public class SalaEspera {

	private List<Jogador> jogadoresEspera;

	/**
	 * Construtor
	 */
	public SalaEspera() {
		setJogadoresEspera(new ArrayList<Jogador>());
	}

	/**
	 * Insere Jogador na sala de Espera e atualiza a lista de jogadores na sala
	 * de espera dos jogadores que esperam o inicio do jogo
	 * 
	 * @param jogadorConectado
	 */
	public void insereJogadorSalaEspera(Jogador jogadorConectado) {
		getJogadoresEspera().add(jogadorConectado);
		atualizaSalaEspera();
		if (getJogadoresEspera().size() == 4) {
			iniciaPartida();
			setJogadoresEspera(new ArrayList<Jogador>());
		}
	}

	/**
	 * Remove Jogador da sala de espero e atualiza a lista de jogadores na sala
	 * de espera dos jogadores que esperam o inicio do jogo Metodo chamado em
	 * caso de desconexao de jogador que estava na sala de espera
	 * 
	 * @param jogadorDesconectado
	 */
	public void removeJogadorSalaEspera(Jogador jogadorDesconectado) {
		getJogadoresEspera().remove(jogadorDesconectado);
		atualizaSalaEspera();
	}

	/**
	 * Monta a lista com o nome de todos os jogadores na sala e pede para que
	 * cada jogador atualiza sua exibicao
	 */
	public void atualizaSalaEspera() {
		List<String> nomeJogadoresEspera = new ArrayList<String>();
		for (Jogador jogador : getJogadoresEspera())
			nomeJogadoresEspera.add(jogador.getNome());

		for (Jogador jogador : getJogadoresEspera()) {
			try {
				jogador.getClient().atualizaSalaEspera(nomeJogadoresEspera);
			} catch (RemoteException e) {
				DezenhoServer.getInstance().desconectaUsuario(
						jogador.getIPUsuario());
				atualizaSalaEspera();
			}
		}
	}

	/**
	 * Inicia partida Metodo chamado quando ha numero suficiente de jogadores
	 * para jogar
	 */
	private void iniciaPartida() {
		Partida partida = new Partida(getJogadoresEspera(), DezenhoServer
				.getInstance().getNextIndicePartida());
		partida.iniciaPartida();
		DezenhoServer.getInstance().adicionaPartida(partida);
	}

	// M�todos de Acesso

	public List<Jogador> getJogadoresEspera() {
		return jogadoresEspera;
	}

	protected void setJogadoresEspera(List<Jogador> jogadoresEspera) {
		this.jogadoresEspera = jogadoresEspera;
	}

}
